August 09, 2021
Open Closed Principal
//stringify๋ฅผ ๊ตฌํํ ์ฝ๋
const a = [1, 'ab"c', true, undefined, null, _ => 3];
JSON.stringify(a);
๋ค์ ์ฝ๋ ์ค el๊ฐ์ฒด๋ฅผ ์ดํด๋ณด์.
const stringCheck = [
[/[\r\n\l]/g, '\\n'],
[/"/g, '\\"'],
[/\t/g, '\\t'],
];
const el = {
number: v => v.toString(),
boolean: v => v.toString(),
string: v =>
`"${stringCheck.reduce((acc, cur) => acc.replace(cur[0], cur[1]), v)}"`,
stringify(v) {
return this[typeof v]?.(v) ?? 'null';
},
};
const arrValidator = arr => {
if (!Array.isArray(arr)) throw 'invalid array';
};
let EMPTY = {};
const stringify = arr => {
arrValidator(arr);
let result = EMPTY;
if (arr.length === 0) result = '[]';
else {
let acc = '',
i = 0;
while (i < acc.length) {
acc + `,${el.stringify(arr[i])}`;
}
result = `[${acc.substr(1)}]`;
}
if (result === EMPTY) throw 'no processed';
return result;
};
el๊ฐ์ฒด ์ฝ๋๋ OCP ์์น์ ๋ฐ๋๋ค.
const el = {
number: v => v.toString(),
boolean: v => v.toString(),
string: v =>
`"${stringCheck.reduce((acc, cur) => acc.replace(cur[0], cur[1]), v)}"`,
stringify(v) {
return this[typeof v]?.(v) ?? 'null';
},
};
function ํ์ ์ ์ถ๊ฐํ๋ค๊ณ ํด๋ณด์. el๊ฐ์ฒด์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค. ์ด ๋ stringify ํจ์๋ ๊ฑด๋ค์ง ์๋๋ค. (OCP ์ค์)
function: v = 'null';
ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ ๋งํ switch๋ก ์ง ๋ค๊ณ ํด๋ณด์. ์๋ ์ฝ๋์์ ๋ง์ฝ function case๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ๋ฉด stringify ํจ์๋ฅผ ์์ ํด์ผ ํ๋ค.
const el = {
stringify(v) {
switch (typeof v) {
case number:
v => v.toString();
break;
case boolean:
v => v.toString();
break;
case string:
v =>
`"${stringCheck.reduce(
(acc, cur) => acc.replace(cur[0], cur[1]),
v
)}"`;
break;
default:
v = 'null';
}
return v;
},
};
stringCheck ํจ์๋ ๋ผ์ฐํฐ์ ๋ผ์ฐํ ํ ์ด๋ธ๋ก ์์ ํด๋ณด์. ๋ํ ์ด ํจ์๋ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ถ๋ถ์ด ๋ฌ๋ผ์ ํ๊ณณ์ผ๋ก ๋ญ์ณ์ค์ผ ํ๋ค.
// ์๋ ์ฝ๋
const stringCheck = [
[/[\r\n\l]/g, '\\n'],
[/"/g, '\\"'],
[/\t/g, '\\t'],
];
const el = {
number: v => v.toString(),
boolean: v => v.toString(),
string: v =>
`"${stringCheck.reduce((acc, cur) => acc.replace(cur[0], cur[1]), v)}"`,
stringify(v) {
return this[typeof v]?.(v) ?? 'null';
},
};
//stringCheck๋ก ๋ญ์ณค๋ค.
const stringCheck = {
data: [
[/[\r\n\l]/g, '\\n'],
[/"/g, '\\"'],
[/\t/g, '\\t'],
],
convert(v) {
return this.data.reduce((acc, cur) => acc.replace(cur[0], cur[1]), v);
},
};
const el = {
number: v => v.toString(),
boolean: v => v.toString(),
string: v => `" ${stringCheck.convert(v)}"`,
stringify(v) {
return this[typeof v]?.(v) ?? 'null';
},
};
convert ํจ์๋ฅผ ์์ ์ ๋ซํ์๊ฒ ์ ์งํ๋ฉด์ ์ผ์ด์คํ์ฅ์ด ๊ฐ๋ฅํ๊ฒ๋ ๋ง๋ค์๋ค.stringCheck์์ convert๋ ๋ผ์ฐํฐ, data๋ ๋ผ์ฐํ ํ ์ด๋ธ์ด๋ค.
el๊ฐ์ฒด๋ ๋ผ์ฐํฐ์ ๋ผ์ฐํ ํ ์ด๋ธ์ด ๊ตฌ๋ถ๋๋๋ก ์์ ํด๋ณด์.
//์๋ ์ฝ๋
const el = {
number: v => v.toString(),
boolean: v => v.toString(),
string: v =>
`"${stringCheck.reduce((acc, cur) => acc.replace(cur[0], cur[1]), v)}"`,
stringify(v) {
return this[typeof v]?.(v) ?? 'null';
},
};
// ์์ ํ ์ฝ๋
const el = {
data: {
number: v => v.toString(),
boolean: v => v.toString(),
string: v => `" ${stringCheck.convert(v)}"`,
},
stringify(v) {
return this.data[typeof v]?.(v) ?? 'null';
},
};
์๋ ์ฝ๋ stringifyํจ์๋ if,else๋ฅผ ์์ ๊ณ ๋ผ์ฐํฐ์ ๋ผ์ฐํ ํ ์ด๋ธ๋ก ๊ตฌํํด๋ณด์.
//์๋ ์ฝ๋
const stringify = arr => {
arrValidator(arr);
let result = EMPTY;
if (arr.length === 0) result = '[]';
else {
let acc = '',
i = 0;
while (i < acc.length) {
acc + `,${el.stringify(arr[i])}`;
}
result = `[${acc.substr(1)}]`;
}
if (result === EMPTY) throw 'no processed';
return result;
};
//์์ ํ ์ฝ๋ (resultProcess ์ถ๊ฐ)
const resultProcess = {
data: {
true: arr => '[]',
false: arr => {
let acc = '',
i = 0;
while (i < acc.length) {
acc + `,${el.stringify(arr[i])}`;
}
return `[${acc.substr(1)}]`;
},
},
process(arr) {
this.data[arr.length === 0];
},
};
const stringify = arr => {
arrValidator(arr);
let result = EMPTY;
return resultProcess.process(arr);
if (result === EMPTY) throw 'no processed';
return result;
};
** ์ญํ ๋ชจ๋ธ : ์ด๋ป๊ฒ ์ฝ๋์ ์ญํ ์ ๋๋ ๊ฒ์ธ๊ฐ? ์ ๋ต: ๋ณํ์จ
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ๋ผ์ฐํฐ๋ฅผ ์์ ํด์ผ ํ๋ฉด OCP๊ฐ ๊นจ์ง๋ ๊ฒ์ธ๊ฐ? ์๋๋ค. ๋ผ์ฐํฐ์ ๋ก์ง์ ๋ง์ถฐ ๋ผ์ฐํ ํ ์ด๋ธ์ด ์กด์ฌํ๋ฏ๋ก ๋ผ์ฐํฐ๋ฅผ ์์ ํ๋ฉฐ ๋ผ์ฐํ ํ ์ด๋ธ์ ์ ๋ฉด๊ฒํ ํด์ผ ํ๋ค. === ํธ๋์ ์
if์ ๋จ๊ณ๋ณ ๊ตฌ์ฑ์์๋ฅผ ๋ถ์ํด์ ๋ณํ์จ์ ๋ฐ๋ผ OCP๋ฅผ ์ค์ํ ์ ์๋ ๋ผ์ฐํฐ์ ๋ผ์ฐํ ํ ์ด๋ธ๋ก ๋ฒ์ญํ๋ค. ์? ์ ์ง๋ณด์๊ฐ ์ข์์ง